/*
 * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#ifndef __GPT_H__
#define __GPT_H__

#include <partition.h>

#define PARTITION_TYPE_GPT        0xee
#define GPT_HEADER_OFFSET        PARTITION_BLOCK_SIZE
#define GPT_ENTRY_OFFSET        (GPT_HEADER_OFFSET +        \
                     PARTITION_BLOCK_SIZE)
#define GUID_LEN            16

#define GPT_SIGNATURE            "EFI PART"

typedef struct gpt_entry {
    unsigned char        type_uuid[GUID_LEN];
    unsigned char        unique_uuid[GUID_LEN];
    unsigned long long    first_lba;
    unsigned long long    last_lba;
    unsigned long long    attr;
    unsigned short        name[EFI_NAMELEN];
} gpt_entry_t;

typedef struct gpt_header {
    unsigned char        signature[8];
    unsigned int        revision;
    unsigned int        size;
    unsigned int        header_crc;
    unsigned int        reserved;
    unsigned long long    current_lba;
    unsigned long long    backup_lba;
    unsigned long long    first_lba;
    unsigned long long    last_lba;
    unsigned char        disk_uuid[16];
    /* starting LBA of array of partition entries */
    unsigned long long    part_lba;
    /* number of partition entries in array */
    unsigned int        list_num;
    /* size of a single partition entry (usually 128) */
    unsigned int        part_size;
    unsigned int        part_crc;
} gpt_header_t;

int parse_gpt_entry(gpt_entry_t *gpt_entry, partition_entry_t *entry);

#endif    /* __GPT_H__ */
